package com.huangfu.learning.javabase.java.pattern.structure.facade;

/**
 * Created with IntelliJ IDEA.
 * Author: huangfu.daohui
 * Date: 2018/8/9
 * Time: 18:21
 * Version: 1.0
 * Description:外观模式：隐藏系统的复杂性，并向客户端提供了一个客户端可以访问系统的接口。
 * https://www.cnblogs.com/lthIU/p/5860607.html
 * http://www.runoob.com/design-pattern/facade-pattern.html
 * 设计到3个角色。
 * 1、门面角色：外观模式的核心。它被客户角色调用，它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。
 * 2、子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互，也可以由供外界调用的接口。
 * 3、客户角色:通过调用Facede来完成要实现的功能。
 * <p>
 * 优点： 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。
 * 缺点：不符合开闭原则，如果要改东西很麻烦，继承重写都不合适。
 * <p>
 * 关键代码：在客户端和复杂系统之间再加一层，这一层将调用顺序、依赖关系等处理好。
 * 使用场景： 1、为复杂的模块或子系统提供外界访问的模块。 2、子系统相对独立。 3、预防低水平人员带来的风险。
 **/
public class FacadePattern {
    // 测试  客户端
    public static void main(String[] args) {
        Computer computer = new Computer();
        System.out.println("*************电脑启动********************");
        computer.start();
        System.out.println("*************电脑关闭********************");
        computer.stop();
    }
}

/**
 * 下面有三个子模块
 * 子系统角色1
 */
class CPU {
    void start() {
        System.out.println("CPU 启动");
    }

    void stop() {
        System.out.println("CPU 关闭");
    }
}

/**
 * 子系统角色2
 */
class Disk {
    void start() {
        System.out.println("磁盘 启动");
    }

    void stop() {
        System.out.println("磁盘 关闭");
    }
}

/**
 * 子系统角色3
 */
class Memory {
    void start() {
        System.out.println("内存 启动");
    }

    void stop() {
        System.out.println("内存 关闭");
    }
}

/**
 * 门面 核心类
 */
class Computer {

    private CPU cpu;
    private Disk disk;
    private Memory memory;

    public Computer() {
        cpu = new CPU();
        disk = new Disk();
        memory = new Memory();
    }

    void start() {
        cpu.start();
        disk.start();
        memory.start();
    }

    void stop() {
        cpu.stop();
        disk.stop();
        memory.stop();
    }
}